home *** CD-ROM | disk | FTP | other *** search
- /*
- ScsiSendRecord.c
- Copyright Paul Baxter
-
- The following MPW commands will build the dcmd and copy it to the
- "Debugger Prefs" file in the System folder. The dcmd's name in
- MacsBug will be the name of the file built by the Linker.
-
- You must have the following object files in the "{Libraries}" directory:
- dcmdGlue.a.o DRuntime.o put.c.o
- You must also have the folowing header files in the "{CIncludes}" directory:
- dcmd.h put.h
-
- C ScsisendRecord.c
- Link "{Libraries}"dcmdGlue.a.o scsisendrecord.c.o "{Libraries}"patchlib.a.o "{Libraries}"put.c.o "{Libraries}"DRuntime.o -o ScsiSendRecord
- BuildDcmd ScsiSendRecord 104
- Echo 'include "ScsiSendRecord";' | Rez -a -o "{systemFolder}Debugger Prefs"
- */
-
- #include <Types.h>
- #include <Scsi.h>
- #include <Errors.h>
- #include <put.h>
- #include <dcmd.h>
- #include <Patch.h>
-
- #define scsiReset 0x0000
- #define scsiGet 0x0001
- #define scsiSelect 0x0002
- #define scsiSelAtn 0x000B
- #define scsiCmd 0x0003
- #define scsiComplete 0x0004
- #define scsiRead 0x0005
- #define scsiWrite 0x0006
- #define scsiRBlind 0x0008
- #define scsiWBlind 0x0009
- #define scsiStat 0x000A
- #define scsiMsgIn 0x000C
- #define scsiMsgOut 0x000D
-
-
- #define TESTUNITREADY 0x00
- #define REQUESTSENSE 0x03
- #define READ 0x08
- #define WRITE 0x0A
- #define SEEK 0x0B
- #define INQUIRY 0x12
- #define MODESELECT 0x15
- #define MODESENSE 0x1A
- #define STARTSTOPUNIT 0x1B
- #define READCAPACITY 0x25
- #define EXTREAD 0x28
- #define EXTSEEK 0x2B
- #define VERIFY 0x2F
-
- static OSErr do_reset(Ptr buffer, long* count, long *len);
- static OSErr do_get(Ptr buffer, long* count, long *len);
- static OSErr do_select(Ptr buffer, long* count, long* len);
- static OSErr do_cmd(Ptr buffer, long* count, long* len);
- static OSErr do_complete(Ptr buffer, long* count, long* len);
- static OSErr do_status(Ptr buffer, long* count, long* len);
- static OSErr do_tib(Ptr buffer, long* count, long* len);
- static OSErr do_msgout(Ptr buffer, long* count, long* len);
- static OSErr do_msgin(Ptr buffer, long* count, long* len);
- static OSErr do_data(Ptr buffer, long* count, long* len);
- static OSErr do_undefined(Ptr buffer, long* count, long* len);
- static void PutSpaces(int count);
- static void do_result(unsigned short result);
- static void do_pstr_word(char* str, unsigned short value);
-
- void PutHexByte (unsigned char number)
- {
- char hex[sizeof(number) << 1 + 1];
- char* digits = "0123456789ABCDEF";
- int n;
-
- hex[0] = sizeof(number) << 1;
- for (n = sizeof(number) << 1; n >= 1; n--)
- {
- hex[n] = digits[number % 16];
- number = number / 16;
- }
- PutPStr(hex);
- }
-
- void PutHexWord (unsigned short number)
- {
-
- char hex[sizeof(number) << 1 + 1];
- char* digits = "0123456789ABCDEF";
- int n;
-
- hex[0] = sizeof(number) << 1;
- for (n = sizeof(number) << 1; n >= 1; n--)
- {
- hex[n] = digits[number % 16];
- number = number / 16;
- }
- PutPStr(hex);
- }
-
- void PutHexLong (unsigned long number)
- {
- char hex[sizeof(number) << 1 + 1];
- char* digits = "0123456789ABCDEF";
- int n;
-
- hex[0] = sizeof(number) << 1;
- for (n = sizeof(number) << 1; n >= 1; n--)
- {
- hex[n] = digits[number % 16];
- number = number / 16;
- }
- PutPStr(hex);
- }
-
- void PutSpaces(int count)
- {
- for (;count--;) {
- PutSpace();
- }
- }
-
- void do_pstr_word(char* str, unsigned short value)
- {
- PutPStr(str);
- PutSpace();
- PutHexWord(value);
- PutSpace();
- }
-
- pascal void CommandEntry (dcmdBlock* paramPtr)
- {
- OSErr err;
- Ptr buffer;
- long count,len;
-
- switch (paramPtr->request)
- {
- case dcmdInit:
- break;
-
- case dcmdHelp:
- dcmdDrawLine ("\pScsiSendRecord");
- dcmdDrawLine ("\p Display Recording buffer.");
- break;
-
- case dcmdDoIt:
- err = SCSISENDRECORD(&buffer, &count);
- if (err == unimpErr) {
- dcmdDrawLine ("\pSCSI Patch not Installed.");
- }
- else {
- dcmdDrawLine ("\pSCSI Recording Buffer:");
- for (;count > 0L;) {
- short cmd;
-
- cmd = *(short*)buffer;
- switch (cmd) {
- case scsiReset:
- err = do_reset(buffer, &count, &len);
- break;
-
- case scsiGet:
- err = do_get(buffer, &count, &len);
- break;
-
- case scsiSelect:
- case scsiSelAtn:
- err = do_select(buffer, &count, &len);
- break;
-
- case scsiStat:
- err = do_status(buffer, &count, &len);
- break;
-
- case scsiCmd:
- err = do_cmd(buffer, &count, &len);
- break;
-
- case scsiRead:
- case scsiWrite:
- case scsiRBlind:
- case scsiWBlind:
- err = do_tib(buffer, &count, &len);
- break;
-
- case scsiComplete:
- err = do_complete(buffer, &count, &len);
- break;
-
- case scsiMsgIn:
- err = do_msgin(buffer, &count, &len);
- break;
-
- case scsiMsgOut:
- err = do_msgout(buffer, &count, &len);
- break;
-
- case data_opcode:
- err = do_data(buffer, &count, &len);
- break;
-
- default:
- err = do_undefined(buffer, &count, &len);
- break;
- }
- buffer += len;
- }
- dcmdDrawLine ("\pEnd.");
- if (err != 0) {
- dcmdDrawLine ("\pWarning Record Buffer Full.");
- }
- }
- }
- } // CommandEntry
-
-
- OSErr do_undefined(Ptr buffer, long* count, long* len)
- {
-
- PutLine();
- do_pstr_word("\pUnknown SCSIDispatch Selector",*((unsigned short*)buffer));
- PutLine();
- *len = 2L;
- if (*count > 1L) {
- *count -= *len;
- }
- else {
- *count = 0L;
- return -1;
- }
- return noErr;
- }
-
- OSErr do_reset(Ptr buffer, long* count, long* len)
- {
- PutPStr("\pscsiReset");
- PutSpaces(4);
-
- *len = 4L;
- if (*count > 3L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_get(Ptr buffer, long* count, long* len)
- {
- PutLine();
-
- PutPStr("\pscsiGet");
- PutSpaces(7);
-
- *len = 4L;
- if (*count > 3L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
-
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_select(Ptr buffer, long* count, long* len)
- {
- if (*(short*)buffer == scsiSelect) {
- PutPStr("\pscsiSelect");
- PutSpaces(3);
- }
- else {
- PutPStr("\pscsiSelectAtn");
- }
- PutSpace();
-
- *len = 6L;
- if (*count > 5L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
-
- PutHexWord(*((unsigned short*)buffer));
- PutSpace();
- buffer += 2L;
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_cmd(Ptr buffer, long* count, long* len)
- {
- short numbytes, cmd_count;
-
- PutPStr("\pscsiCmd");
- PutSpaces(7);
-
- *len = 2L;
- if (*count > 1L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- numbytes = *(short*)buffer;
- if (*count >= (long)(numbytes + 4)) {
- *count -= (long)(numbytes + 4);
- *len += (long)(numbytes + 4);
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- cmd_count = 0;
- for (;numbytes; numbytes--, buffer++, cmd_count++) {
- if (cmd_count == 0) {
- switch (*buffer) {
- case TESTUNITREADY:
- PutPStr("\pTESTUNITREADY");
- break;
-
- case REQUESTSENSE:
- PutPStr("\pREQUESTSENCE");
- break;
-
- case READ:
- PutPStr("\pREAD");
- break;
-
- case WRITE:
- PutPStr("\pWRITE");
- break;
-
- case SEEK:
- PutPStr("\pSEEK");
- break;
-
- case INQUIRY:
- PutPStr("\pINQUIRY");
- break;
-
- case MODESELECT:
- PutPStr("\pMODESELECT");
- break;
-
- case MODESENSE:
- PutPStr("\pMODESENSE");
- break;
-
- case STARTSTOPUNIT:
- PutPStr("\pSTARTSTOPUNIT");
- break;
-
- case READCAPACITY:
- PutPStr("\pREADCAPACITY");
- break;
-
- case EXTREAD:
- PutPStr("\pEXTENDED_READ");
- break;
-
- case EXTSEEK:
- PutPStr("\pEXTENDED_SEEK");
- break;
-
- case VERIFY:
- PutPStr("\pVERIFY");
- break;
-
- default:
- PutHexByte(*buffer);
- break;
- }
- }
- else {
- PutHexByte(*buffer);
- }
- PutSpace();
- }
-
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_tib(Ptr buffer, long* count, long* len)
- {
- short scsi_tib_op, tib_count;
-
- switch (*(short*)buffer) {
- case scsiRead:
- PutPStr("\pscsiRead");
- PutSpaces(3);
- break;
-
- case scsiWrite:
- PutPStr("\pscsiWrite");
- PutSpaces(2);
- break;
-
- case scsiRBlind:
- PutPStr("\pscsiRBlind");
- PutSpace();
- break;
-
- case scsiWBlind:
- PutPStr("\pscsiWBlind");
- PutSpace();
- break;
- }
- *len = 2L;
- if (*count > 1L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- *count = 0L;
- return -1;
- }
- tib_count = 0;
- do {
- *len += 10L;
- if (*count > 9L) {
- *count -= 10L;
- }
- else {
- *count = 0L;
- return -1;
- }
- scsi_tib_op = *(short*)buffer;
- buffer += 2L;
- PutSpaces(3);
- if (tib_count > 0) {
- PutSpaces(11);
- }
- switch (scsi_tib_op) {
- case scInc:
- PutPStr("\pscInc");
- PutSpaces(3);
- break;
-
- case scNoInc:
- PutPStr("\pscNoInc");
- PutSpace();
- break;
-
- case scAdd:
- PutPStr("\pscAdd");
- PutSpaces(3);
- break;
-
- case scMove:
- PutPStr("\pscMove");
- PutSpaces(2);
- break;
-
- case scLoop:
- PutPStr("\pscLoop");
- PutSpaces(2);
- break;
-
- case scNop:
- PutPStr("\pscNop");
- PutSpaces(3);
- break;
-
- case scStop:
- PutPStr("\pscStop");
- PutSpaces(2);
- break;
-
- case scComp:
- PutPStr("\pscComp");
- PutSpaces(2);
- break;
-
- default:
- PutPStr("\pTib Corrupt!");
- PutLine();
- *count = 0L;
- return -1;
- break;
- }
-
- PutHexLong(*((unsigned long*)buffer));
- PutSpace();
- buffer += 4L;
- PutHexLong(*((unsigned long*)buffer));
- if (scsi_tib_op != scStop) {
- PutLine();
- }
- buffer += 4L;
- tib_count++;
- } while (scsi_tib_op != scStop);
-
- *len += 2L;
- if (*count > 1L) {
- *count -= 2L;
- }
- else {
- *count = 0L;
- return -1;
- }
-
- PutSpace();
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_complete(Ptr buffer, long* count, long* len)
- {
- PutPStr("\pscsiComplete");
- PutSpaces(2);
-
- *len = 20L;
- if (*count > 19L) {
- *count -= *len;
- buffer += 10L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- PutPStr("\pTime");
- PutSpace();
- PutHexLong(*((unsigned long*)buffer));
- PutSpace();
- buffer += 4L;
-
- do_pstr_word("\pStatus", *((unsigned short*)buffer));
- buffer += 2L;
- do_pstr_word("\pMessage", *((unsigned short*)buffer));
- buffer += 2L;
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_msgout(Ptr buffer, long* count, long* len)
- {
- PutPStr("\pscsiMsgOut");
- PutSpaces(4);
-
- *len = 6L;
- if (*count > 5L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- do_pstr_word("\pMessage", *((unsigned short*)buffer));
- buffer += 2L;
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_msgin(Ptr buffer, long* count, long* len)
- {
- PutPStr("\pscsiMsgIn");
- PutSpaces(5);
-
- *len = 10L;
- if (*count > 9L) {
- *count -= *len;
- buffer += 6L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- do_pstr_word("\pMessage", *((unsigned short*)buffer));
- buffer += 2L;
- do_result(*((unsigned short*)buffer));
- return noErr;
- }
-
- OSErr do_status(Ptr buffer, long* count, long* len)
- {
-
- PutPStr("\pscsiStat");
- PutSpaces(6);
-
- *len = 4L;
- if (*count > 3L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
- do_pstr_word("\pStatus Word", *((unsigned short*)buffer));
- PutLine();
- return noErr;
- }
-
- OSErr do_data(Ptr buffer, long* count, long* len)
- {
- short data_len, cnt;
-
- PutPStr("\pscsiData");
- PutSpaces(6);
-
- *len = 4L;
- if (*count > 3L) {
- *count -= *len;
- buffer += 2L;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
-
- data_len = *((unsigned short*)buffer);
- buffer += 2L;
- *len += (long)data_len;
- if (*count >= (long)data_len) {
- *count -= (long)data_len;
- }
- else {
- PutLine();
- *count = 0L;
- return -1;
- }
-
- for (cnt = 1;data_len; cnt++, data_len--, buffer++) {
- PutHexByte(*buffer);
- PutSpace();
- if ((cnt % 16) == 0) {
- PutLine();
- PutSpaces(14);
- }
- }
- PutLine();
- return noErr;
- }
-
- void do_result(unsigned short result)
- {
- PutPStr("\p:");
- PutSpace();
- switch (result) {
- case noErr:
- PutPStr("\pnoErr");
- break;
-
- case scCommErr:
- PutPStr("\pscCommErr");
- break;
-
- case scArbNBErr:
- PutPStr("\pscArbNBErr");
- break;
-
- case scBadParmsErr:
- PutPStr("\pscBadParmsErr");
- break;
-
- case scPhaseErr:
- PutPStr("\pscPhaseErr");
- break;
-
- case scCompareErr:
- PutPStr("\pscCompareErr");
- break;
-
- case scMgrBusyErr:
- PutPStr("\pscMgrBusyErr");
- break;
-
- case scSequenceErr:
- PutPStr("\pscSequenceErr");
- break;
-
- case scBusTOErr:
- PutPStr("\pscBusTOErr");
- break;
-
- case scComplPhaseErr:
- PutPStr("\pscComplPhaseErr");
- break;
-
- default:
- PutHexWord(result);
- break;
- }
- PutLine();
- }